#include <iostream>

// me gusta la garlompa
//
// Clases
//

class cOne {
	int m_x;

public:
	cOne(int x=0) {m_x = x;}
	~cOne() {}
	void SetX(int x) {m_x = x;}
	int GetX(void) const {return m_x;}
};


//
// Funciones Auxiliares
// 

void func1(cOne one) {
	one.SetX(9);
	int j = one.GetX();
	std::cout << "El numero es: " << j << std::endl;
}

void func2(cOne& one) {
	one.SetX(9);
	int j = one.GetX();
	std::cout << "El numero es: " << j << std::endl;
}

void func3(const cOne& one) {
	//one.SetX(9);
	int j = one.GetX();
	std::cout << "El numero es: " << j << std::endl;
}	


//
// Main
//

int main(void) {

	cOne t(2);

	// El valor del entero dentro del objeto no cambia por el pasaje por valor de la funcion 1 
	// Me tendria que salir 9
	func1(t);
	// Me tendria que salir 2
	std::cout << "El Numero Original es: " << t.GetX() << std::endl;

	// El Valor es modificado porque el argumento se toma por referencia
	//Deberia imprimirme 9
	func2(t);
	// Me tendria que salir 9
	std::cout << "El Numero Original es: " << t.GetX() << std::endl;

	// No se puede modificar el valor pq el objeto es pasado como const reference
	const cOne z(6);	
	
	//Esta llamada fallara pq el argumento no es const
	//func2(z);

	// Esta llamada anda bien porque el argumento es const
	func3(z);
	

	return 0;
}
